From 421b18073ab17499d4ec5eb4a34f6862739a0740 Mon Sep 17 00:00:00 2001 From: "mjw@wray-m-3.hpl.hp.com" Date: Tue, 15 Mar 2005 11:58:01 +0000 Subject: [PATCH] bitkeeper revision 1.1159.269.4 (4236cdc9eib4ejH25MkiyfkGp022dQ) Add channel function to close an event channel and call when devices are destroyed. Signed-off-by: Mike Wray --- tools/python/xen/xend/server/blkif.py | 2 ++ tools/python/xen/xend/server/channel.py | 26 ++++++++++++++++++++++++- tools/python/xen/xend/server/netif.py | 2 ++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index 8a1de09bfc..e90b45f74c 100755 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -181,6 +181,8 @@ class BlkifBackendInterface(controller.BackendInterface): self.close() d = defer.Deferred() d.addCallback(cb_destroy) + if self.evtchn: + channel.eventChannelClose(self.evtchn) self.send_be_disconnect(response=d) def send_be_disconnect(self, response=None): diff --git a/tools/python/xen/xend/server/channel.py b/tools/python/xen/xend/server/channel.py index 127f38f2c0..bdf7efd588 100755 --- a/tools/python/xen/xend/server/channel.py +++ b/tools/python/xen/xend/server/channel.py @@ -11,7 +11,31 @@ VIRQ_CONSOLE = 3 # (DOM0) bytes received on emergency console. VIRQ_DOM_EXC = 4 # (DOM0) Exceptional event for some domain. def eventChannel(dom1, dom2): - return xc.evtchn_bind_interdomain(dom1=dom1, dom2=dom2) + """Create an event channel between domains. + The returned dict contains dom1, dom2, port1 and port2 on success. + + @return dict (empty on error) + """ + evtchn = xc.evtchn_bind_interdomain(dom1=dom1, dom2=dom2) + if evtchn: + evtchn['dom1'] = dom1 + evtchn['dom2'] = dom2 + return evtchn + +def eventChannelClose(evtchn): + """Close an event channel that was opened by eventChannel(). + """ + def evtchn_close(dom, port): + if (dom is None) or (port is None): return + try: + xc.evtchn_close(dom=dom, port=port) + except Exception, ex: + pass + + if not evtchn: return + evtchn_close(evtchn.get('dom1'), evtchn.get('port1')) + evtchn_close(evtchn.get('dom2'), evtchn.get('port2')) + class ChannelFactory: """Factory for creating channels. diff --git a/tools/python/xen/xend/server/netif.py b/tools/python/xen/xend/server/netif.py index d63c342435..753ae29972 100755 --- a/tools/python/xen/xend/server/netif.py +++ b/tools/python/xen/xend/server/netif.py @@ -288,6 +288,8 @@ class NetDev(controller.SplitDev): if change: self.reportStatus() log.debug("Destroying vif domain=%d vif=%d", self.controller.dom, self.vif) + if self.evtchn: + channel.eventChannelClose(self.evtchn) self.vifctl('down') d = self.send_be_disconnect() d.addCallback(cb_destroy) -- 2.30.2